package com.Volatile;


/**
 * volatile 的可见性
 * 在Java的内存模型中(JMM Java Memeory Model) 每个线程都有自己的工作内存，当对一个属性进行赋值时，首先对自己工作内存中的属性赋值，然后赋值主内存中的值，这是没有加volatile的情况，
 * 如果对属性加上volatile，则会在对主内存赋值之后，通知保存前值的副本的其他线程本副本过期，其他线程读的时候直接从主内存中读取，然后回写到当前线程。
 *
 *
 *
 */
public class Visibility {

    public volatile Integer age = 0;

    public void changeAge(){

        /**
         * 这里也可以使用 synchronized (),保证属性的可见性，
         * 这是由于 synchronized 内的线程回清空工作内存中的属性副本，重新从主内存中读取最新的值，在工作内存中设置之后，又写回主内存，
         * 而且每次都是一个线程在操作，也就保存了可见性
         */


        age = 20;
    }

    public static void main(String[] args) {

        Visibility visibility = new Visibility();

        new Thread(()->{

            try {

                Thread.sleep(3000);
            }catch (Exception e){

            }

            visibility.changeAge();

            System.out.println("age =" + visibility.age);
        }).start();

        while (visibility.age == 0){


        }
        System.out.println("-------------结束------------");
    }

}
